package com.springboot.zuul.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

/**
 * @author XiaoLuo
 * @ClassName: LoginFilter
 * @Description: ${todo}
 * @date 2019/4/8 14:53
 */
@Component
public class LoginFilter extends ZuulFilter {

    @Override
    public String filterType() {
        /*
        filterType：返回字符串，代表过滤器的类型。包含以下4种：
        - pre：请求在被路由之前执行
        - routing：在路由请求时调用
        - post：在routing和errror过滤器之后调用
        - error：处理请求时发生错误调用
         */
        return "pre";
    }

    @Override
    public int filterOrder() {
//        filterOrder：通过返回的int值来定义过滤器的执行顺序，数字越小优先级越高
        return 1;
    }

    @Override
    public boolean shouldFilter() {
//        shouldFilter：返回一个Boolean值，判断该过滤器是否需要执行。返回true执行，返回false不执行
        return true;
    }

    @Override
    public Object run() throws ZuulException {
//        run：过滤器的具体业务逻辑

//        登录校验逻辑
//        1）获取Zuul提供的上下文对象
        RequestContext requestContext = RequestContext.getCurrentContext();
//        2)从上下文中获取request对象
        HttpServletRequest request = requestContext.getRequest();
//        3）从请求中获取token
        String token = request.getParameter("access-token");
//        4）判断
        if (token==null||"".equals(token.trim())){
//            没有token登录校验失败，拦截
            requestContext.setSendZuulResponse(false);
//            返回401状态码。也可以考虑重定向到登录页
            requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
        }
//        校验通过，可以考录把用户信息放入上下文，继续向后执行
        return null;
    }
}
